home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 9
/
The PC-SIG Library on CD ROM - Ninth Edition.iso
/
301_400
/
DISK0353
/
DISK0353.ZIP
/
AMAZING.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1984-09-14
|
9KB
|
293 lines
{ (c) 1984 by Neil J. Rubenking }
program Amazing;
type
ColumnType = 1..80;
regpack = record
ax,bx,cx,dx,bp,di,si,ds,es,flags: integer;
end;
var
StopNow : boolean;
StCol, EndCol : ColumnType;
StRow, EndRow : 1..24;
BlankChance : 1..120;
Ex : array[1..42] of char;
ThisRow, LastRow : array[1..80] of char;
N, M, ScreenSeg : integer;
attribute : byte;
OneUp, OneLeft, OneDown, OneRight,
TwoUp, TwoLeft, TwoDown, TwoRight,
NoUp, NoLeft, NoDown, NoRight : set of char;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
function Escape: boolean;
var
C, D : char;
begin
D := chr(0);
if keypressed then read(Kbd,C);
if keypressed then read(Kbd,D);
if (C = chr(27)) and (D = chr(0)) then Escape := true
else Escape := false;
end;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
function FindColor:byte;
var
ranfor, ranbak : byte;
begin
ranfor := random(16);
repeat
ranbak := random(8)
until ranbak <> ranfor;
FindColor := (ranbak shl 4) or ranfor;
end;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
function ReadScreen(col,row:byte):char;
var
LocationCode : integer;
begin
LocationCode := (col-1)*2 + (row-1)*160;
ReadScreen := chr(Mem[ScreenSeg:LocationCode]);
end;
{============================================================================}
procedure WriteScrn(col, row: byte; thisChar:char);
var
LocationCode : integer;
begin
LocationCode := (col-1)*2 + (row-1)*160;
Mem[ScreenSeg:locationCode] := ord(ThisChar);
Mem[ScreenSeg:LocationCode+1] := attribute;
end;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
procedure initialize;
begin
StCol := 0;
EndCol := 0;
StRow := 0;
EndRow := 0;
BlankChance := 0;
IF (Mem[0000:1040] AND 48) <> 48 THEN ScreenSeg := $B800
ELSE ScreenSeg := $B000;
attribute := 15;
randomize;
repeat
GotoXY(5,5);
Write('Starting column (1-79):');
GotoXY(7,6);
Write('Ending column (1-79):');
GotoXY(29,5); Read(StCol);
GotoXY(29,6); Read(EndCol);
until (StCol>0) and (EndCol>StCol) and (EndCol<80);
WriteLn;
repeat
GotoXY(8,8);
Write('Starting row (1-24):');
GotoXY(10,9);
Write('Ending row (1-24):');
GotoXY(29,8); Read(StRow);
GotoXY(29,9); Read(EndRow);
until (StRow>0) and (EndRow>StRow) and (EndRow<25);
WriteLn;
repeat
WriteLn('Enter # of blanks in character list. (1-120)');
read(BlankChance);
until (BlankChance>0) and (BlankChance<121);
ClrScr;
for N := 1 to 40 do Ex[N] := chr(178 + N);
for N := 1 to BlankChance do Ex[40 + N] := ' ';
OneUp := [Ex[ 1],Ex[ 2],Ex[ 3],Ex[12],Ex[14],Ex[15],Ex[17],Ex[19],
Ex[20],Ex[29],Ex[34],Ex[38],Ex[39]];
OneLeft := [Ex[ 2],Ex[ 4],Ex[ 5],Ex[11],Ex[13],Ex[15],Ex[16],Ex[18],
Ex[19],Ex[30],Ex[32],Ex[37],Ex[39]];
OneDown := [Ex[ 1],Ex[ 2],Ex[ 3],Ex[ 6],Ex[13],Ex[16],Ex[17],Ex[19],
Ex[20],Ex[31],Ex[35],Ex[38],Ex[40]];
OneRight := [Ex[14],Ex[15],Ex[16],Ex[17],Ex[18],Ex[19],Ex[21],Ex[30],
Ex[32],Ex[33],Ex[36],Ex[37],Ex[40]];
TwoUp := [Ex[ 4],Ex[ 7],Ex[ 8],Ex[10],Ex[11],Ex[21],Ex[22],Ex[24],
Ex[26],Ex[28],Ex[30],Ex[33],Ex[37]];
TwoLeft := [Ex[ 3],Ex[ 6],Ex[ 7],Ex[ 9],Ex[10],Ex[12],Ex[24],Ex[25],
Ex[27],Ex[28],Ex[29],Ex[31],Ex[38]];
TwoDown := [Ex[ 4],Ex[ 5],Ex[ 7],Ex[ 8],Ex[ 9],Ex[21],Ex[23],Ex[25],
Ex[26],Ex[28],Ex[32],Ex[36],Ex[37]];
TwoRight := [Ex[20],Ex[22],Ex[23],Ex[24],Ex[25],Ex[26],Ex[27],Ex[28],
Ex[29],Ex[31],Ex[34],Ex[35],Ex[38]];
NoUp := [Ex[ 5],Ex[ 6],Ex[ 9],Ex[13],Ex[16],Ex[18],Ex[23],Ex[25],
Ex[27],Ex[31],Ex[32],Ex[35],Ex[36],Ex[40],Ex[41]];
NoLeft := [Ex[ 1],Ex[ 8],Ex[14],Ex[17],Ex[20],Ex[21],Ex[22],Ex[23],
Ex[26],Ex[33],Ex[34],Ex[35],Ex[36],Ex[40],Ex[41]];
NoDown := [Ex[10],Ex[11],Ex[12],Ex[14],Ex[15],Ex[18],Ex[22],Ex[24],
Ex[27],Ex[29],Ex[30],Ex[33],Ex[34],Ex[39],Ex[41]];
NoRight := [Ex[ 1],Ex[ 2],Ex[ 3],Ex[ 4],Ex[ 5],Ex[ 6],Ex[ 7],Ex[ 8],
Ex[ 9],Ex[10],Ex[11],Ex[12],Ex[13],Ex[39],Ex[41]];
for N := StCol to EndCol do LastRow[N] := ' ';
end; {procedure initialize}
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
function ValidNeighbour(Nabe:char; P:ColumnType):char;
var
XX : char;
YY : 1..80;
begin
if Nabe in OneRight then
begin
if LastRow[P] in OneDown then
begin
repeat
XX := Ex[random(40)+1]
until (XX in OneUp) and (XX in OneLeft)
end;
if LastRow[P] in TwoDown then
begin
repeat
XX := Ex[random(40)+1]
until (XX in TwoUp) and (XX in OneLeft)
end;
if LastRow[P] in NoDown then
begin
repeat
XX := Ex[random(40)+1]
until (XX in NoUp) and (XX in OneLeft)
end;
end; {if Nabe in OneRight}
if Nabe in TwoRight then
begin
if LastRow[P] in OneDown then
begin
repeat
XX := Ex[random(40)+1]
until (XX in OneUp) and (XX in TwoLeft)
end;
if LastRow[P] in TwoDown then
begin
repeat
XX := Ex[random(40)+1]
until (XX in TwoUp) and (XX in TwoLeft)
end;
if LastRow[P] in NoDown then
begin
repeat
XX := Ex[random(40)+1]
until (XX in NoUp) and (XX in TwoLeft)
end;
end; {if Nabe in TwoRight}
if Nabe in NoRight then
begin
if LastRow[P] in OneDown then
begin
repeat
XX := Ex[random(40)+1]
until (XX in OneUp) and (XX in NoLeft)
end;
if LastRow[P] in TwoDown then
begin
repeat
XX := Ex[random(40)+1]
until (XX in TwoUp) and (XX in NoLeft)
end;
if LastRow[P] in NoDown then
begin
repeat
YY := random(40+BlankChance)+1;
if YY <= 41 then
XX := Ex[YY]
else XX := ' ';
until (XX in NoUp) and (XX in NoLeft)
end;
end; {if Nabe in NoRight}
ValidNeighbour := XX;
end; {function ValidNeighbour}
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
procedure MostRows;
var
ThisChar : char;
{--------------------------------------------}
procedure LastOne;
begin
repeat
ThisRow[EndCol] := ValidNeighbour(ThisRow[EndCol-1],EndCol)
until ThisRow[EndCol] in NoRight;
end;
{--------------------------------------------}
begin {main procedure MostRows}
if ScreenSeg = $B800 then
if random(10) mod 10 = 0 then
attribute := findcolor;
ThisRow[StCol] := ValidNeighbour(Ex[41],StCol);
writeScrn(StCol,M,ThisRow[StCol]);
for N := StCol+1 to EndCol-1 do
begin
ThisRow[N] := ValidNeighbour(ThisRow[N-1],N);
WriteScrn(N,M,ThisRow[N]);
end;
LastOne;
WriteScrn(EndCol,M,ThisRow[EndCol]);
LastRow := ThisRow;
end;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
procedure FinalRow;
var
counter : byte;
begin
repeat
ThisRow[StCol] := ValidNeighbour(Ex[41],StCol)
until ThisRow[StCol] in NoDown;
writeScrn(StCol,EndRow,ThisRow[StCol]);
for N := StCol+1 to EndCol-1 do
begin
repeat
ThisRow[N] := ValidNeighbour(ThisRow[N-1],N)
until ThisRow[N] in NoDown;
WriteScrn(N,EndRow,ThisRow[N]);
end;
counter := 0;
repeat
ThisRow[EndCol] := ValidNeighbour(ThisRow[EndCol-1],EndCol);
counter := counter + 1;
until ((ThisRow[EndCol] in NoDown) and (ThisRow[EndCol] in NoRight))
or (counter = 100);
if counter = 100 then ThisRow[EndCol] := Ex[41];
WriteScrn(EndCol,EndRow,ThisRow[EndCol]);
end;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
procedure ScrollUp(fun:byte);
var
recpack: regpack;
ah,al,bh,bl,ch,cl,dh,dl: byte;
begin
ah := 6;
al := fun;
bh := 15; {attribute}
ch := StRow-1;
cl := StCol-1;
dh := EndRow;
dl := EndCol+1;
with recpack do
begin
ax := ah shl 8 + al;
bx := bh shl 8 + bl;
cx := ch shl 8 + cl;
dx := dh shl 8 + dl;
end;
intr($10,recpack); {call interrupt}
end;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
procedure MovingMaze;
begin
M := EndRow;
for N := StCol to EndCol do ThisRow[N] := ' ';
ScrollUp(0);
repeat
MostRows;
ScrollUp(1);
until Escape;
end;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
Begin
initialize;
for M := StRow to (EndRow-1) do MostRows;
FinalRow;
GotoXY(1,1);
Write('Press Escape ');
repeat until Escape;
read(Kbd);
MovingMaze;
ClrScr;
end.